package com.shujia

object Code28Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map 分为可变和不可变
     * ① Map创建时，可以使用Tuple 也可以使用 ->
     * ② Map中后添加的相同Key其Value会覆盖先添加的Value
     * ③ Map中所有的Key Value数据类型要求一致
     * ④ 对于Map中的KeyValue数据类型可以存储任意的数据类型
     * ⑤ Map中取值有两种形式：1.map(key)  2.map.get(key)  第一种方式并不安全，取不到值会报错 第二种相对较为安全
     *
     */

    val map: Map[String, String] = Map(
      ("key1", "value1"),
      ("key2", "value1"),
      "key3" -> "value1",
      "key2" -> "value4"
      //      , 1 -> 2
    )
    println(map)

    val key1Value: String = map("key1")
    println(key1Value)

    val key2Value: Option[String] = map.get("key2") // 返回的是一个 Option 对象
    println(key2Value)
    println(key2Value.get)

    //    if(!map.contains("key2")){
    //      println("当前Key不存在")
    //    }else{
    //      println(map.get("key2").get)
    //    }

    val valueRes: String = map.getOrElse("key2", "None")
    println(valueRes)

    val list: List[(String, String)] = map.toList


    val groupByRes: Map[String, Map[String, String]] = map.groupBy(
      (tuple: (String, String)) => {
        tuple._2
      }
    )

    println(groupByRes)

    // Map中每一个元素都是一个Tuple Tuple形式有很多 Map使用的是 Tuple2
    val mapRes: Map[String, Int] = groupByRes.map(
      (elem: (String, Map[String, String])) => (elem._1, elem._2.size)
    )

    println(mapRes)



  }
}
